//
//  DMFacebookTypes.h
//  DualMediationSDK
//
//  Facebook相关类型定义和数据模型
//  Created by YeJary on 2025/1/15.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

#pragma mark - 日志标签定义

/**
 * Facebook日志标签枚举
 */
typedef NS_ENUM(NSUInteger, DMFacebookLogTag) {
    DMFacebookLogTagGeneral = 0,    // 一般信息
    DMFacebookLogTagLogin,          // 登录相关
    DMFacebookLogTagShare,          // 分享相关
    DMFacebookLogTagUserInfo,       // 用户信息相关
    DMFacebookLogTagCache,          // 缓存相关
    DMFacebookLogTagError           // 错误信息
};

#pragma mark - Facebook用户信息模型

/**
 * Facebook用户信息模型
 */
@interface DMFacebookUserInfo : NSObject

/**
 * 用户ID
 */
@property (nonatomic, copy) NSString *userId;

/**
 * 用户名称
 */
@property (nonatomic, copy) NSString *name;

/**
 * 用户邮箱
 */
@property (nonatomic, copy, nullable) NSString *email;

/**
 * 用户头像URL
 */
@property (nonatomic, copy, nullable) NSString *pictureURL;

/**
 * 登录时间
 */
@property (nonatomic, strong) NSDate *loginTime;

/**
 * 从字典创建用户信息对象
 * @param dictionary 包含用户信息的字典
 * @return 用户信息对象
 */
+ (instancetype)userInfoWithDictionary:(NSDictionary *)dictionary;

/**
 * 转换为字典格式
 * @return 用户信息字典
 */
- (NSDictionary *)toDictionary;

@end

#pragma mark - Facebook分享结果模型

/**
 * Facebook分享结果模型
 */
@interface DMFacebookShareResult : NSObject

/**
 * 分享是否成功
 */
@property (nonatomic, assign) BOOL success;

/**
 * 分享结果消息
 */
@property (nonatomic, copy) NSString *message;

/**
 * 分享ID（如果有）
 */
@property (nonatomic, copy, nullable) NSString *shareId;

/**
 * 分享时间
 */
@property (nonatomic, strong) NSDate *shareTime;

/**
 * 创建分享结果对象
 * @param success 是否成功
 * @param message 结果消息
 * @return 分享结果对象
 */
+ (instancetype)resultWithSuccess:(BOOL)success message:(NSString *)message;

/**
 * 创建分享结果对象
 * @param success 是否成功
 * @param error 错误对象
 * @return 分享结果对象
 */
- (instancetype)initWithSuccess:(BOOL)success error:(nullable NSError *)error;

@end

#pragma mark - Facebook错误定义

/**
 * Facebook错误域
 */
FOUNDATION_EXPORT NSString * const DMFacebookErrorDomain;
/**
 * Facebook错误代码枚举
 */
typedef NS_ENUM(NSInteger, DMFacebookErrorCode) {
    DMFacebookErrorCodeUnknown = 1000,          // 未知错误
    DMFacebookErrorCodeNotInitialized,         // SDK未初始化
    DMFacebookErrorCodeLoginCancelled,         // 登录取消
    DMFacebookErrorCodeLoginFailed,            // 登录失败
    DMFacebookErrorCodeShareFailed,            // 分享失败
    DMFacebookErrorCodeShareCancelled,         // 分享取消
    DMFacebookErrorCodeUserInfoFailed,         // 获取用户信息失败
    DMFacebookErrorCodeNetworkError,           // 网络错误
    DMFacebookErrorCodePermissionDenied,       // 权限被拒绝
    DMFacebookErrorCodeNoAccessToken           // 无有效访问令牌
};

/**
 * 创建Facebook错误对象
 * @param code 错误代码
 * @param message 错误消息
 * @return 错误对象
 */
NSError *DMFacebookError(DMFacebookErrorCode code, NSString *message);

#pragma mark - Facebook登录响应模型

/**
 * Facebook登录响应模型
 */
@interface DMLoginResponse : NSObject

/**
 * 登录是否成功
 */
@property (nonatomic, assign) BOOL success;

/**
 * 响应消息
 */
@property (nonatomic, copy) NSString *message;

/**
 * 用户信息（登录成功时）
 */
@property (nonatomic, strong, nullable) NSDictionary *userInfo;

/**
 * 访问令牌（登录成功时）
 */
@property (nonatomic, copy, nullable) NSString *accessToken;

/**
 * 错误信息（登录失败时）
 */
@property (nonatomic, strong, nullable) NSError *error;

/**
 * 登录时间
 */
@property (nonatomic, strong) NSDate *loginTime;

/**
 * 创建成功的登录响应
 * @param userInfo 用户信息
 * @param accessToken 访问令牌
 * @return 登录响应对象
 */
+ (instancetype)successResponseWithUserInfo:(NSDictionary *)userInfo accessToken:(NSString *)accessToken;

/**
 * 创建失败的登录响应
 * @param error 错误信息
 * @return 登录响应对象
 */
+ (instancetype)failureResponseWithError:(NSError *)error;

@end

NS_ASSUME_NONNULL_END
